package es.uned.etsii.si3.taller.servlets;

import java.sql.SQLException;
import java.util.Map;

import org.apache.struts2.interceptor.SessionAware;

import com.opensymphony.xwork2.ActionSupport;

import es.uned.etsii.si3.taller.*;

public class Identificador extends ActionSupport implements SessionAware {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private Map<String, Object> userSession;
	private String nombreUsuario;
	private String claveUsuario;
	private String mensajeDelInterceptor = "";
	private String nuevoRol = "";
	
	public static final String ATRIBUTO_USUARIO = "usuario";
	public static final String ATRIBUTO_ROL     = "rol";
	public static final String ATRIBUTO_ROL_EF  = "rol_efectivo";

	@Override
	public void setSession(Map<String, Object> session) {
		userSession = session;
	}
	
	public String getNombreUsuario() {
		return nombreUsuario;
	}
	
	public void setNombreUsuario(String nombreUsuario) {
		this.nombreUsuario = nombreUsuario;
	}
	
	private String getClaveUsuario() {
		return claveUsuario;
	}
	
	public void setClaveUsuario(String claveUsuario) {
		this.claveUsuario = claveUsuario;
	}
	
	public String getMensajeDelInterceptor() {
		return mensajeDelInterceptor;
	}
	
	public void setM(int mensaje) {
		if (mensaje == 1) {
			mensajeDelInterceptor = "Acceso ilegal - debe identificarse";
		}
	}
	
	public void setNuevoRol(String nR) {
		nuevoRol = nR;
	}

	/**
	 * Esta clase comprueba que el login es correcto. Si lo es
	 * lo carga en la sesión
	 * return action eror
	 */
	public String execute() {
		String retValue = SUCCESS;

		try {
			Usuario usuarioEncontrado;

			usuarioEncontrado = Usuario.buscarPorNombreUsuario(getNombreUsuario());
			if (usuarioEncontrado == null) {
				addActionError("El nombre de usuario es incorrecto");
			}
			else if (!usuarioEncontrado.claveCorrecta(getClaveUsuario())) {
				addActionError("Clave incorrecta para el usuario '" + getNombreUsuario() + "'");
			}
			else if (!usuarioEncontrado.getActivo()) {
				addActionError("El usuario no se encuentra activo.");
				addActionError("Si ha solicitado el alta, debe esperar a que el administrador active su cuenta.");
			}
			else {
				userSession.put(ATRIBUTO_USUARIO, usuarioEncontrado);
				if (usuarioEncontrado.getEsCliente()) {
					userSession.put(ATRIBUTO_ROL, Usuario.ROL_CLIENTE);
					retValue = Usuario.ROL_CLIENTE;
				}
				else {
					String rol = usuarioEncontrado.getEmpleado().getRol();
					userSession.put(ATRIBUTO_ROL, rol);
					if (rol.equals(Empleado.ROL_ADMINISTRADOR)) {
						userSession.put(ATRIBUTO_ROL_EF, rol);
					}
					retValue = rol;
				}
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			addActionError("Fallo al buscar el usuario " + e);
		} catch (Exception e)
		{
			addActionError ("Error dios sabe de que " + e);
		}
		
		if (hasActionErrors())
			retValue = ERROR;
		
		return retValue;
	}
	
	private boolean registrado() {
		return userSession.containsKey(ATRIBUTO_USUARIO);
	}
	
	/**
	 * Si el usuario ya está registrado, informamos de ello
	 * @return actionerror
	 */
	public String display() {
		// Si el usuario ya está registrado, le informamos de ello
		if (registrado()) {
			return "identificado";
		}

		return SUCCESS;
	}

	/**
	 * Permite realizar el logout de la aplicación
	 * @return action error
	 */
	public String logout() {
		String retValue;
		
		// Si el usuario no está registrado, le informamos de ello
		if (!registrado()) {
			retValue = "noIdentificado";
		}
		else {
			Usuario usuario = (Usuario) userSession.get(ATRIBUTO_USUARIO);

			setNombreUsuario(usuario.getUsuario());
			userSession.remove(ATRIBUTO_USUARIO);
			userSession.remove(ATRIBUTO_ROL);
			if (userSession.containsKey(ATRIBUTO_ROL_EF)) {
				userSession.remove(ATRIBUTO_ROL_EF);
			}
			
			retValue = SUCCESS;
		}

		return retValue;
	}
	
	public String cambiarRolEfectivo() {
		String retVal = ERROR;
		
		if (!registrado()) {
			addActionError("No tiene permitido el acceso a esta página sin estar registrado");
		}
		else {
			String rolRealUsuario = (String) userSession.get(ATRIBUTO_ROL);
			
			if (!rolRealUsuario.equals(Empleado.ROL_ADMINISTRADOR)) {
				addActionError("No tiene credenciales para ejecutar esta opeación");
			}
			else if (!(nuevoRol == null)) {
				if (nuevoRol.equals(Empleado.ROL_ADMINISTRADOR) ||
						nuevoRol.equals(Empleado.ROL_JEFESECCION) ||
						nuevoRol.equals(Empleado.ROL_JEFETALLER) ||
						nuevoRol.equals(Empleado.ROL_MECANICO))
				{
					retVal = nuevoRol;
					userSession.put(ATRIBUTO_ROL_EF, nuevoRol);
				}
				else {
					addActionError("El rol indicado es incorrecto");
				}
			}
			else {
				addActionError("No se indicó un rol a cambiar");
			}
		}
		
		return retVal;
	}
}